<?php

namespace app\job;

use think\queue\Job;

/**
 * 消费者类
 * 用于处理队列中的任务
 */
class Test
{
    /**
     * fire是消息队列默认调用的方法
     * @param Job $job 当前的任务对象
     * @param array|mixed $data 发布任务时自定义的数据
     */
    public function fire(Job $job, $data)
    {
        //有效消息到达消费者时可能已经不再需要执行了
        if(!$this->checkJob($data)){
            $job->delete();
            return;
        }

        //执行业务处理
        if($this->doJob($data)){
            $job->delete();//任务执行成功后删除
        }else{
            //检查任务重试次数
            if($job->attempts() > 3){
                // 第1种处理方式：重新发布任务,该任务延迟10秒后再执行
                //$job->release(10);
                // 第2种处理方式：原任务的基础上1分钟执行一次并增加尝试次数
                //$job->failed();
                // 第3种处理方式：删除任务
                $job->delete();
            }
        }
    }

    /**
     * 消息在到达消费者时可能已经不需要执行了
     * @param array|mixed $data 发布任务时自定义的数据
     * @return boolean 任务执行的结果
     */
    private function checkJob($data)
    {
        //验证数据
//        $id = $data["id"];
        if(isset($data['id'])){
            return true;
        }else{
            var_dump('参数有误！');
            return true;
        }
    }

    /**
     * 根据消息中的数据进行实际的业务处理
     */
    private function doJob($data)
    {
        // 实际业务流程处理
        var_dump($data);
        if(isset($data['id'])){
            return true;
        }else{
            return false;
        }
    }

    // 消息队列执行失败后会自动执行该方法
    public function failed($data)
    {
        ppd('消息队列达到最大重复执行次数后失败：' . json_encode($data));
    }
}
